from test_tools.script.copy_file_client import *
from test_tools.script.export import Export
from test_tools.script.nacos_requests import NacosQuests
from test_tools.script.path_tool import *

themes_list = ['dark_amber.xml',
               'dark_blue.xml',
               'dark_cyan.xml',
               'dark_lightgreen.xml',
               'dark_pink.xml',
               'dark_purple.xml',
               'dark_red.xml',
               'dark_teal.xml',
               'dark_yellow.xml',
               'light_amber.xml',
               'light_blue.xml',
               'light_blue_500.xml',
               'light_cyan.xml',
               'light_cyan_500.xml',
               'light_lightgreen.xml',
               'light_lightgreen_500.xml',
               'light_orange.xml',
               'light_pink.xml',
               'light_pink_500.xml',
               'light_purple.xml',
               'light_purple_500.xml',
               'light_red.xml',
               'light_red_500.xml',
               'light_teal.xml',
               'light_teal_500.xml',
               'light_yellow.xml']

extra = {
    "danger": "#dc3545",
    "warning": "#ffc107",
    "success": "#1dd1a1",
    "font_family": "Roboto"
}

high_color_dict = {
    "红色": "red",
    "蓝色": "blue",
    "绿色": "green",
    "黄色": "yellow",
    "橙色": "orange",
    "青色": "cyan",
    "紫色": "purple",
    "白色": "white",
    "黑色": "black",
    "粉色": "pink",
    "灰色": "grey"
}

server_name = [
    "策划服环境1",
    "开发服环境1",
    "测试服环境1",
    "策划服环境2",
    "开发服环境2",
    "测试服环境2",
    "策划服环境3",
    "开发服环境3",
    "测试服环境3",
]


def get_excel(_excel_path: str) -> list:
    """
    获取指定文件夹中的所有excel
    excel_path：excel所在目录相对路径
    return: 所有带路径的文件名列表
    """
    excel_list = [_excel_path + name for name in os.listdir(_excel_path) if
                  name.endswith('.xlsx') and not name.startswith('~')]
    log(f"get_excel >>> {excel_list}")
    return excel_list


def get_zip(_zip_path: str) -> list:
    """获取指定相对路径目录下所有zip文件"""
    log(f"get_zip >>> {_zip_path}")
    zip_list = [name for name in os.listdir(_zip_path) if
                name.endswith('.zip')]
    if len(zip_list) > 0:
        zip_list.sort(reverse=True)
    return zip_list


def time_format(_time) -> str:
    if isinstance(_time, time.struct_time):
        return time.strftime("%Y-%m-%d %H:%M:%S", _time)
    elif isinstance(_time, (int, float)):
        return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(_time))
    elif isinstance(_time, str):
        _time = time.localtime(int(_time))
        return time.strftime("%Y-%m-%d %H:%M:%S", _time)
    else:
        raise ValueError(f"转换类型错误，非时间戳 {_time}")


def print_path():
    """输出脚本和程序工作目录"""
    log("==========输出脚本和程序工作目录==========")
    current_dir = os.path.dirname(os.path.abspath(__file__))
    working_dir = os.getcwd()
    log(f"当前脚本 {os.path.basename(__file__)} 运行目录： {current_dir}")
    log(f"当前程序工作目录：{working_dir}")
    log("======================================")


class ExcelToolsData:
    def __init__(self):
        print_path()
        self.extra = extra  # 样式
        self.themes_list = themes_list  # 主题列表
        self.high_color_dict = high_color_dict  # 高亮颜色列表
        self.tab = 0
        # --------------- tab1 配置------------------
        self.up_server_index = None  # 上传服索引
        self.server_config_index = None  # 参考服索引
        self.export_dir_index = None  # 导表目录索引
        self.high_color_index = None  # 高亮颜色
        self.is_export_excel = None  # 是否导表
        self.is_up_data = None  # 是否自动上传
        self.is_down_config = None  # 是否强制更新参考服配置
        self.is_copy_file = None  # 是否复制到工程
        #  --------------- tab2 配置------------------
        self.up_server_index_2 = None  # 上传服索引
        self.server_config_index_2 = None  # 参考服索引
        self.svn_old_index = None  # svn旧节点
        self.svn_new_index = None  # svn新节点
        self.is_copy_file_2 = None  # 是否复制到工程
        self.is_zip_file = None  # 是否将json文件压缩
        self.up_zip_index = None  # 上传zip文件索引
        self.is_uPdata_accessToken = None  # 是否更新 nacos accessToken
        self.is_uPdata_svn = None  # 上传文件后是否自动更新svn旧节点
        #  --------------- 其它配置 ------------------
        self.themes = None  # 主题
        self.Style_qss = None  # style 文件内容
        self.old_time = None  # 参考服配置更新时间戳
        self.time_interval = None  # 拉取服务器需要用的配置时，以该字段的时增量作为间隔（以秒为单位）
        self.high_color_format = None  # 高亮格式
        self.server_config_txt = None  # 参考服配置列表
        self.excel_tool_config_json = None  # 客户端配置
        self.server_list_json = None  # nacos 服务器配置
        self.select_items = None  # 选择上传的json文件
        self.nacos_requests = None
        self.zip_list = get_zip(export_excel)  # zip 文件列表Z
        self.server_name_list = []  # 服务器名称列表
        self.export_dir_list = ["all_excel", "export_excel"]  # 导表目录列表
        self.__print = my_print.print  # 主窗口日志输出信号发射器
        self.__start = my_print.start  # 主窗口开始执行任务时发射信号
        self.__end = my_print.end  # 主窗口任务结束时发射器信号
        self.__to_end = my_print.to_end  # 主窗口输出日志时滚动条滚动到底部发射信号
        self.__add_list = my_print.add_list  # 主窗口添加 config_server 文件夹中的配置时发射信号
        self.__message = ExcelToolsMessageView()
        self.set_datas()

    def set_datas(self):
        """设置初始数据"""
        log("ExcelToolsData-> set_datas")
        try:
            # --------------------tal1-----------------
            self.server_config_txt = read_lines_file(server_config_path)
            self.excel_tool_config_json = get_json_data(excel_tools_config_path)
            self.server_list_json = get_json_data(server_list_path)
            debug_log.log_key = self.excel_tool_config_json["debug_log"]  # 日志输出开关
            self.up_server_index = self.excel_tool_config_json["up_server_index"]  # 上传服
            self.server_config_index = self.excel_tool_config_json["server_config_index"]  # 参考服
            self.export_dir_index = self.excel_tool_config_json["export_dir_index"]  # 导表目录
            self.is_export_excel = self.excel_tool_config_json["is_export_excel"]  # 是否导表
            self.is_up_data = self.excel_tool_config_json["is_up_data"]  # 是上传
            self.is_down_config = self.excel_tool_config_json["is_down_config"]  # 是否强制更新参考服配置
            self.is_copy_file = self.excel_tool_config_json["is_copy_file"]  # 是否复制到工程
            # --------------------tal2-----------------
            self.up_server_index_2 = self.excel_tool_config_json["up_server_index_2"]  # 上传服
            self.server_config_index_2 = self.excel_tool_config_json["server_config_index_2"]  # 参考服
            self.is_copy_file_2 = self.excel_tool_config_json["is_copy_file_2"]  # 是否复制到工程
            self.is_zip_file = self.excel_tool_config_json["is_zip_file"]  # 是压缩文件
            self.svn_old_index = self.excel_tool_config_json["svn_old_index"]  # SVN上次热更节点
            self.svn_new_index = self.excel_tool_config_json["svn_new_index"]  # SVN本次热更节点
            self.is_uPdata_svn = self.excel_tool_config_json["is_uPdata_svn"]
            self.is_uPdata_accessToken = self.excel_tool_config_json["is_uPdata_accessToken"]  # 是否更新 nacos accessToken
            # --------------------其它配置-----------------
            self.themes = self.excel_tool_config_json["themes"]  # 主题
            self.old_time = self.excel_tool_config_json["old_time"]  # 更新时间戳
            self.time_interval = self.excel_tool_config_json["time_interval"]  # 更新间隔时间
            self.high_color_index = self.excel_tool_config_json["high_color_index"]  # 高亮颜色
            self.high_color_format = self.excel_tool_config_json["high_color_format"]  # 高亮格式
            if len(self.server_list_json) > 0:
                for items in self.server_list_json:
                    self.server_name_list.append(items['serverName'])
            else:
                self.server_name_list = server_name
            self.Style_qss = load_file(style_qss_path)  # style 文件内容
        except Exception as e:
            log(f"ExcelToolsData-> set_datas >>> {e}")
            self.__print("**************** 设置初始数据 失败 ****************", 1)
            prin_error()
            self.__message.show_message(f"{os.path.basename(__file__)} >>> 设置初始数据 异常：{e}")

    def set_tab(self, tab: int):
        """设置输出log窗口"""
        log(f"ExcelToolsData-> set_tab >>> {tab}")
        self.tab = tab
        if tab == 1 and self.nacos_requests is None:
            self.nacos_requests = NacosQuests()

    def write_config(self):
        """将数据写入配置表"""
        log("ExcelToolsData-> write_config")
        # --------------------tal1-----------------
        self.excel_tool_config_json["up_server_index"] = self.up_server_index
        self.excel_tool_config_json["server_config_index"] = self.server_config_index
        self.excel_tool_config_json["export_dir_index"] = self.export_dir_index
        self.excel_tool_config_json["is_export_excel"] = self.is_export_excel
        self.excel_tool_config_json["is_up_data"] = self.is_up_data
        self.excel_tool_config_json["is_copy_file"] = self.is_copy_file
        self.excel_tool_config_json["is_down_config"] = self.is_down_config
        # --------------------tal2-----------------
        self.excel_tool_config_json["up_server_index_2"] = self.up_server_index_2
        self.excel_tool_config_json["server_config_index_2"] = self.server_config_index_2
        self.excel_tool_config_json["is_copy_file_2"] = self.is_copy_file_2
        self.excel_tool_config_json["is_zip_file"] = self.is_zip_file
        self.excel_tool_config_json["svn_old_index"] = self.svn_old_index
        self.excel_tool_config_json["svn_new_index"] = self.svn_new_index
        self.excel_tool_config_json["is_uPdata_accessToken"] = self.is_uPdata_accessToken
        self.excel_tool_config_json["is_uPdata_svn"] = self.is_uPdata_svn
        # --------------------其它配置-----------------
        self.excel_tool_config_json["themes"] = self.themes
        self.excel_tool_config_json["high_color_index"] = self.high_color_index
        self.excel_tool_config_json["high_color_format"] = self.high_color_format
        self.excel_tool_config_json["old_time"] = self.old_time
        # self.__log(self.config_json)
        try:
            # write_json_data(self.__path_tool.excel_tools_config_path, self.excel_tool_config_json)
            write_json_data(excel_tools_config_path, self.excel_tool_config_json)
        except Exception as e:
            log(f"ExcelToolsData-> write_config >>> {e}")
            self.__print("**************** 将数据写入配置表 失败 ****************", 1)
            prin_error()
            self.__message.show_message(f"{os.path.basename(__file__)} >>> 将数据写入配置表 异常：{e}")

    def get_height_color(self) -> str:
        """获取高亮颜色"""
        log("ExcelToolsData-> get_high_color")
        log(f"self.get_high_color: {self.high_color_index}")
        return self.high_color_dict[self.high_color_index]

    def add_height(self, height_text) -> str:
        """设置高亮颜色"""
        return f"{self.high_color_format['head']}{self.get_height_color()}{self.high_color_format['middle']}{height_text}{self.high_color_format['tail']}"

    def write_time(self):
        """
        记录时间戳
        time：时间戳
        """
        log("ExcelToolsData-> write_time")
        self.__print("正在执行：记录时间戳")
        self.old_time = int(time.time())
        try:
            self.write_config()
            self.__print(f"记录时间戳成功：{self.old_time} , 时间: {time_format(self.old_time)}")
        except Exception as e:
            log(f"ExcelToolsData-> write_time >>> {e}")
            self.__print("**************** 记录时间戳 失败 ****************", 1)
            prin_error()
            self.__message.show_message(f"{os.path.basename(__file__)} >>> 记录时间戳 异常：{e}")

    def down_groupConfig(self):
        """
        更新server_config.txt文件，并将更新时间写入time.txt文件
        """
        log("ExcelToolsData-> down_groupConfig")
        try:
            self.__print("正在执行：更新server_config.txt文件")
            groupConfig = self.get_groupConfig(self.server_config_index)
            groupConfig.sort()
            if len(groupConfig) != 0:
                dataIds = '\n'.join(groupConfig)
                write_file(server_config_path, dataIds)
                self.server_config_txt = read_lines_file(server_config_path)
                self.__print(f"{server_config_path} 更新成功")
                self.write_time()
            else:
                self.__print("没有需要更新的配置")
        except Exception as e:
            log(f"ExcelToolsData-> down_groupConfig >>> {e}")
            self.__print("**************** 更新server_config.txt文件 失败 ****************", 1)
            prin_error()
            self.__message.show_message(f"{os.path.basename(__file__)} >>> 更新server_config.txt文件 异常：{e}")

    @staticmethod
    def get_NacosClient(clientServer_config: dict) -> nacos.NacosClient:
        """
        获取NacosClient对象
        server_list_index：需要连接的服务器配置列表
        return: NacosClient对象
        """
        SERVER_ADDRESSES = clientServer_config['serverIPAddress']
        NAMESPACE = clientServer_config['namespace']
        ak = clientServer_config['ak']
        sk = clientServer_config['sk']
        try:
            return nacos.NacosClient(server_addresses=SERVER_ADDRESSES, namespace=NAMESPACE, ak=ak, sk=sk)
        except Exception as e:
            log("**************** 获取NacosClient对象 失败 ****************")
            prin_error()
            raise f"获取NacosClient对象 异常：{e}"

    def get_groupConfig(self, index: int) -> list:
        """
        根据服务器类型索引，生成 NacosClient 对象获取分组下的所有 json 配置文件名
        index：服务器列表的索引
        return: 所有分组下的所有 json 配置文件名
        """
        log(f"ExcelToolsData-> get_groupConfig( {index} )")
        self.__print("正在执行：获取分组下的所有 json 配置文件名")
        groupConfig = []
        if len(self.server_list_json) == 0:
            self.__print("**************** 获取服务器配置 失败 server_list.json文件为空****************", 1)
            return groupConfig
        clientServer_config = self.server_list_json[index]
        group = clientServer_config['group']
        try:
            client = self.get_NacosClient(clientServer_config)
            configs = client.test_get_configs(group=group, timeout=10000)
        except Exception as e:
            log(f"ExcelToolsData-> get_groupConfig >>> {e}")
            self.__print("**************** 获取服务器配置 失败 ****************", 1)
            prin_error()
            self.__message.show_message(f"{os.path.basename(__file__)} >>> 获取服务器配置 异常：{e}")
            return groupConfig

        if configs is not None:
            pageItems = configs["pageItems"]
            for pageItem in pageItems:
                dataId = pageItem['dataId']
                if dataId.endswith('.json'):
                    groupConfig.append(dataId)
            self.__print(f"服务器使用配置数量：{len(groupConfig)}")
        else:
            self.__print(f"****nacos 分组：{group} 没有找到任何配置****", 1)
        return groupConfig

    def get_dir_server_list(self) -> list:
        """
        递归获取 config_server 目录下的所有文件名
        return: 所有不带路径的文件名列表
        """
        log("ExcelToolsData-> get_dir_server_list")
        try:
            self.__print("正在执行：获取 config_server 目录下的所有文件名")
            if not os.path.exists(dirServer):
                os.makedirs(dirServer)
                return []
            files = os.listdir(dirServer)
            log(f"ExcelToolsData-> get_dir_server_list -> files: {files}")
            return self.check_up_files_list(files)
        except Exception as e:
            log(f"ExcelToolsData-> get_dir_server_list >>> {e}")
            self.__print("**************** 获取 config_server 目录下的所有文件名 失败 ****************", 1)
            prin_error()
            self.__message.show_message(
                f"{os.path.basename(__file__)} >>> 获取 config_server 目录下的所有文件名 异常：{e}")
            return []

    def check_up_files_list(self, to_up_files_list: list) -> list:
        """检查需要上传的文件是否为服务器需要用到的配置文件"""
        log(f"ExcelToolsData-> check_up_files_list( {to_up_files_list} )")
        up_files_list = []
        if len(to_up_files_list) != 0:
            for filename in to_up_files_list:
                if filename not in self.server_config_txt:
                    self.__print(f"【{filename} 不在 server_config.txt 列表里！已被排除！】", 1)
                    continue
                up_files_list.append(filename)
        else:
            self.__print(f"【无服务器需要上传的文件】")
        return up_files_list

    def publishConfig(self, listToUpload: list):
        """
        上传配置
        server_list_index：服务器列表
        """
        log("ExcelToolsData-> publishConfig")
        if len(self.server_list_json) == 0:
            self.__print("**************** 上传配置 失败 server_list.json 文件为空****************", 1)
            return
        clientServer_config = self.server_list_json[self.up_server_index]
        group = clientServer_config['group']
        count = 0
        if len(listToUpload) != 0:
            try:
                self.__print("正在执行：将服务器需要用到的配置上传到服务器")
                client = self.get_NacosClient(clientServer_config)
                for filename in listToUpload:
                    f = os.path.join(dirServer, filename)
                    if not os.path.exists(f):
                        self.__print(f"**************** {f} 文件不存在 ****************", 1)
                        continue
                    with open(f, encoding="utf-8") as file:
                        data = json.load(file)
                        data = json.dumps(data, ensure_ascii=False)
                    if client.publish_config(data_id=filename, group=group, content=data, config_type='json',
                                             timeout=5000):
                        count += 1
                        self.__print(f"++++++上传成功：{filename}")
                self.__print(f"上传的服务器：{self.server_list_json[self.up_server_index]['serverName']}")
                self.__print(f"上传配置数量：{count}")
                self.__print(f"参考配置数量：{len(self.server_config_txt)}")
                if self.export_dir_list[self.export_dir_index] == "all_excel" and self.is_up_data:
                    if len(listToUpload) != len(self.server_config_txt):
                        for x in range(3):
                            self.__print(f"********** 警告 警告 警告 **********", 1)
                            self.__print(
                                f"********** 上传配置数量[{len(listToUpload)}]与参考配置数量[{len(self.server_config_txt)}]不一致 "
                                f"**********", 1)
            except Exception as e:
                log(f"ExcelToolsData-> publishConfig >>> {e}")
                self.__print("**************** 上传失败 ****************", 1)
                prin_error()
                self.__message.show_message(f"{os.path.basename(__file__)} >>> 将配置上传到服务器时 异常：{e}")
        else:
            self.__print(f"**** {dirServer}文件夹为空,无需上传 ****")

    def check_down_groupConfig(self):
        """
        检查是否需要更新server_config.txt文件
        """
        log("ExcelToolsData-> check_down_groupConfig")
        # 只有关闭强制更新时才会使用智能检测更新，开启强制更新时，每次都是最新的 server_config.txt
        try:
            if not self.is_down_config:
                self.__print("正在执行：检查是否需要更新server_config.txt文件")
                current_time = int(time.time())
                self.__print(f"上次时间：{time_format(self.old_time)}")
                self.__print(f"当前时间：{time_format(current_time)}")
                if current_time - self.old_time <= self.time_interval:
                    self.__print(f"【相差时间不到{int(self.time_interval / 3600)} 小时，不需要更新】")
                else:
                    self.down_groupConfig()
        except Exception as e:
            log(f"ExcelToolsData-> check_down_groupConfig >>> {e}")
            self.__print("**************** 检查是否需要更新server_config.txt文件 失败 ****************", 1)
            prin_error()
            self.__message.show_message(
                f"{os.path.basename(__file__)} >>> 检查是否需要更新server_config.txt文件 异常：{e}")

    def get_loca_time(self):
        """获取本地时间（结构化格式）"""
        log("ExcelToolsData-> get_loca_time")
        local_time = time.localtime()
        self.__print(f"执行时间: {time_format(local_time)}")

    def start(self):
        """主要函数，执行调度所有操作"""
        log("ExcelToolsData-> start")
        # 获取脚本所在的目录
        self.__print(f"root_path：{root_path}")
        # -----------------------------------------------------------
        # 获取【excel】文件夹中的excel
        _all_excel = get_excel(all_excel)
        # 获取【export_excel】文件夹中的excel
        _export_excel = get_excel(export_excel)
        # ------------------------【选择导表方式】-----------------------------------
        # 导出excel: all_excel export_excel
        export_type = [_all_excel, _export_excel]
        try:
            self.__start()
            if self.is_down_config:
                self.__print('【【【【【【【【【【【【【【【【【【【【【【【 强制更新 】】】】】】】】】】】】】】】】】】】】】】】')
                self.down_groupConfig()  # 更新server_config.txt文件
                self.__print('】】】】】】】】】】】】】】】】】】】】】】】 更新完成 【【【【【【【【【【【【【【【【【【【【【【【')
                self.__to_end()
            if self.is_export_excel:
                self.__print('【【【【【【【【【【【【【【【【【【【【【【【 开始导出 】】】】】】】】】】】】】】】】】】】】】】】')
                log(f"{export_type[self.export_dir_index]}")
                export = Export()
                is_ok, _len = export.check_server_config()
                if is_ok:
                    self.check_down_groupConfig()
                else:
                    self.down_groupConfig()
                if len(export_type[self.export_dir_index]) == 0:
                    self.__print(f"**** {export_type[self.export_dir_index]} 没有可导表的excel ****", 1)
                else:
                    export.main(export_type[self.export_dir_index])
                self.__print('】】】】】】】】】】】】】】】】】】】】】】】 导出完成 【【【【【【【【【【【【【【【【【【【【【【【')
                self.__add_list()
                self.__to_end()
            if self.is_copy_file:
                self.__print('【【【【【【【【【【【【【【【【【【【【【【【 开始复制 】】】】】】】】】】】】】】】】】】】】】】】')
                copy_file_client = Copy_file_client()
                copy_file_client.copyfile()  # 复制配置文件到工程
                self.__print('】】】】】】】】】】】】】】】】】】】】】】】 复制完成 【【【【【【【【【【【【【【【【【【【【【【【')
                self.__to_end()
            if self.is_up_data:
                self.__print('【【【【【【【【【【【【【【【【【【【【【【【 开始上传 】】】】】】】】】】】】】】】】】】】】】】】')
                listToUpload = self.get_dir_server_list()
                self.publishConfig(listToUpload)  # 上传配置到服务器
                self.__print('】】】】】】】】】】】】】】】】】】】】】】】 上传完成 【【【【【【【【【【【【【【【【【【【【【【【')
                self.__to_end()
        except Exception as e:
            log(f"ExcelToolsData-> start >>> {e}")
            self.__print("**************** 执行定制任务 失败 ****************", 1)
            prin_error()
            self.__message.show_message(f"{os.path.basename(__file__)} >>> 执行定制任务时 异常：{e}")
        self.get_loca_time()
        self.__to_end()
        self.__end()
        self.__print('\n======================================= 执行完毕 =======================================\n\n')

    def up_select_items(self):
        """手动上传指定服务器配置"""
        log(f"ExcelToolsData-> up_select_items")
        self.__start()
        self.__print('【【【【【【【【【【【【【【【【【【【【【【【 开始 手动上传 】】】】】】】】】】】】】】】】】】】】】】】')
        try:
            self.publishConfig(self.select_items)
            self.__print('】】】】】】】】】】】】】】】】】】】】】】】 完成 手动上传 【【【【【【【【【【【【【【【【【【【【【【【')
        except Exception as e:
            log(f"ExcelToolsData-> up_select_items >>> {e}")
            self.__print("**************** 手动上传指定服务器配置 失败 ****************", 1)
            prin_error()
            self.__message.show_message(f"{os.path.basename(__file__)} >>> 手动上传指定服务器配置时 异常：{e}")
        self.get_loca_time()
        self.__to_end()
        self.__end()
        self.__print('\n======================================= 执行完毕 =======================================\n\n')

    def hot_export(self):
        """执行热更导表"""
        log(f"ExcelToolsData-> hot_export")
        try:
            self.__start()
            export = Export()
            # 对EXCEL目录进行清理（svn cleanup excel --remove-unversioned），恢复（svn revert -R excel）
            export.do_cmd("svn cleanup excel --remove-unversioned")
            export.do_cmd("svn revert -R excel")
            # 更新SVN到新节点 （svn update -r 版本号 excel）
            export.do_cmd(f"svn update -r {self.svn_new_index} excel")
            # 比对新节点和旧节点之间的差异文件（svn diff excel -r 旧版本号:新版本号 --summarize）
            export.do_cmd_stream(f"svn diff excel -r {self.svn_old_index}:{self.svn_new_index} --summarize",
                                 get_log=True)
            export_list = []
            for _log in export.log_list:
                _log = _log.split('\\')[1]
                export_list.append(_log)
                log(_log)
            # 清空单独导表目录（clear_dir(dir_path)）
            # clear_dir(hope_city_path)
            clear_dir(export_excel_path)
            clear_dir(hope_city_path + "/hope_city2")
            # 将节点之间的差异文件复制到单独导表目录 (copy_file(source, target))
            isOk, _msg = copy_some_files(excel_path, export_excel_path, export_list)
            if isOk:
                self.__print(f"**** 热更 excel 复制完成 ****\n{export_list}\n************************")
            else:
                self.__print(f"**** 热更 excel 复制失败 ****", 1)
                self.__print(f"{export_list}", 1)
                self.__print(f"{_msg}\n************************", 1)
            # 对单独导表目录进行导表
            _export_excel = get_excel(export_excel)
            self.__print('【【【【【【【【【【【【【【【【【【【【【【【 开始导出 】】】】】】】】】】】】】】】】】】】】】】】')
            is_ok, _len = export.check_server_config()
            if is_ok:
                self.check_down_groupConfig()
            else:
                self.down_groupConfig()
            if len(_export_excel) == 0:
                self.__print(f"**** {_export_excel} 没有可导表的excel ****", 1)
            else:
                export.main(_export_excel)
            self.__print('】】】】】】】】】】】】】】】】】】】】】】】 导出完成 【【【【【【【【【【【【【【【【【【【【【【【')
            zip_hope_city2 = join_path(hope_city_path, "hope_city2")
            isOk, _msg = copy_file(dirServer, zip_hope_city2)
            if isOk:
                self.__print(f"热更 json 文件复制完成 >> {zip_hope_city2}")
            else:
                self.__print(f"**** 热更 json 文件复制到 {zip_hope_city2} 失败 ****", 1)
                self.__print(f"{export_list}", 1)
                self.__print(f"{_msg}\n************************", 1)
            # 如果勾选了复制，就进行复制
            if self.is_copy_file_2:
                self.__print('【【【【【【【【【【【【【【【【【【【【【【【 开始复制 】】】】】】】】】】】】】】】】】】】】】】】')
                copy_file_client = Copy_file_client()
                copy_file_client.copyfile()  # 复制配置文件到工程
                self.__print('】】】】】】】】】】】】】】】】】】】】】】】 复制完成 【【【【【【【【【【【【【【【【【【【【【【【')
            # 如果勾选了压缩，就进行压缩
            if self.is_zip_file:
                self.__print('【【【【【【【【【【【【【【【【【【【【【【【 开始压缩 】】】】】】】】】】】】】】】】】】】】】】】')
                base_name = f"{export_excel_path}/hope_city2_{time.strftime('%Y_%m_%d_%H_%M_%S', time.localtime())}"
                log(f"{base_name}")
                info = shutil.make_archive(base_name, 'zip', hope_city_path)
                self.__print(f"最新压缩文件：\n{info}\n")
                self.zip_list = get_zip(export_excel)
                if len(self.zip_list) == 0 or not self.zip_list:
                    self.__print("**** export_excel目录下没有可上传的zip文件 ****", 1)
                    return
                log(f"export_excel目录下zip格式文件： >>> {self.zip_list}")
                self.__print("export_excel目录下zip文件：")
                self.__print('\n'.join(self.zip_list))
                self.__add_list()
                self.__print('】】】】】】】】】】】】】】】】】】】】】】】 压缩完成 【【【【【【【【【【【【【【【【【【【【【【【')
            self.__end()
        except Exception as e:
            self.__print("**************** 热更导表时 错误 ****************", 1)
            prin_error()
            self.__message.show_message(f"{os.path.basename(__file__)} >>> 热更导表时 异常：{e}")
            self.__add_list()
            self.__end()

    def push_hot_export(self):
        """执行配置上传"""
        log(f"ExcelToolsData-> push_hot_export")
        # 判断ZIP文件是否存在
        try:
            self.__start()
            zip_path = join_path(export_excel_path, self.up_zip_index)
            if os.path.exists(zip_path):
                self.__print('【【【【【【【【【【【【【【【【【【【【【【【 上传ZIP 】】】】】】】】】】】】】】】】】】】】】】】')
                # self.__print(zip_path)
                self.nacos_requests.set_uPdata(self.is_uPdata_accessToken)
                self.nacos_requests.check_token()
                server_config = self.server_list_json[self.up_server_index_2]
                self.nacos_requests.send_config(server_config["namespace"], zip_path)
                self.__print('】】】】】】】】】】】】】】】】】】】】】】】 上传完成 【【【【【【【【【【【【【【【【【【【【【【【')
            else:
                self.__print("**** 没有找到需要上传的zip文件 ****", 1)
                self.__print(zip_path, 1)
                return
            if self.is_uPdata_svn:
                self.__print(f'旧的SVN节点{self.svn_old_index} >> 已经替换为新节点{self.svn_new_index}')
                self.svn_old_index = self.svn_new_index
                self.write_config()
            self.__add_list()
            self.__end()
        except Exception as e:
            self.__print("**************** 上传zip文件 失败 ****************", 1)
            prin_error()
            self.__message.show_message(f"{os.path.basename(__file__)} >>> 上传zip文件 异常：{e}")
            self.__add_list()
            self.__end()
